/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package persistencia;

import java.util.Date;
import java.util.List;
import modelo.HibernateUtil;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pojos.Paciente;
import pojos.Procesoasistencial;
import pojos.Urgencias;

/**
 *
 * @author cvenegas
 */
public class UrgenciasDAO {
    
    private Session sesion;
    private Transaction tx;
    
    private void iniciaOperacion() throws HibernateException {
        sesion = HibernateUtil.getSessionFactory().openSession();
        tx = sesion.beginTransaction();
    }
    
    private void manejaExcepcion(HibernateException he) throws HibernateException {
        tx.rollback();
        throw new HibernateException("Error en la capa de acceso a datos", he);
    }
    
    
    
    public void addUrgencia(Urgencias u) {
        iniciaOperacion();
        sesion.save(u);
        tx.commit();
        sesion.close();
    }
    
    public List<Integer> getCodigosUrgencias() {
        List<Integer> listaDeCodigos;
        iniciaOperacion();
        listaDeCodigos = sesion.createQuery("SELECT idUrgencia FROM Urgencias").list();
        sesion.close();

        return listaDeCodigos;
    }
    
    public List<Urgencias> getUrgenciaPorIdYFecha(Integer codUrgencia, Date fecha) {
        List<Urgencias> urgencia;
        iniciaOperacion();
        urgencia = sesion.createQuery("FROM Urgencias WHERE idUrgencia=" + codUrgencia + " AND fechaUrgencia='" + fecha+"'").list();
        sesion.close();

        return urgencia;
    }

    public List<Urgencias> getUrgenciaporId(Integer codUrgencia) {
        List<Urgencias> urgencia;
        iniciaOperacion();
        urgencia = sesion.createQuery("FROM Urgencias WHERE idUrgencia=" + codUrgencia).list();
        sesion.close();

        return urgencia;
    }

    public List<Urgencias> getUrgenciasPorfecha(Date fecha) {
        List<Urgencias> urgencia;
        iniciaOperacion();
        urgencia = sesion.createQuery("FROM Urgencias WHERE fechaUrgencia='" + fecha+"'").list();
        sesion.close();

        return urgencia;
    }
    
    
    public Urgencias getUrgencia(Date fecha) {
        Urgencias urgencia;
        iniciaOperacion();
        urgencia = (Urgencias) sesion.createQuery("FROM Urgencias WHERE fechaUrgencia=" + fecha).uniqueResult();
        sesion.close();
        return urgencia;
    }
    
    public Urgencias getUrgencia(Integer cod) {
        Urgencias urgencia;
        iniciaOperacion();
        urgencia = (Urgencias) sesion.createQuery("FROM Urgencias WHERE codPaciente=" + cod).uniqueResult();
        sesion.close();
        return urgencia;
    }
    
    public List<Urgencias> getUrgenciasDani() {
        List<Urgencias> listaUrgencias;
        iniciaOperacion();
        listaUrgencias = sesion.createQuery("FROM Urgencias").list();
        sesion.close();

        return listaUrgencias;
    }
    
    
    public int guardaUrgencia(Urgencias p) throws HibernateException {
        int id;
        try {
            iniciaOperacion();
            id = (int) sesion.save(p);
            tx.commit();
        } catch (HibernateException he) {
            manejaExcepcion(he);
            throw he;
        } finally {
            sesion.close();
        }
        return id;
    }
    
    public void eliminarUrgencia(Urgencias urgenciaEliminar)
    {
        iniciaOperacion();
        sesion.delete(urgenciaEliminar);
        tx.commit();
        sesion.close();
        
    }
    
    public void eliminaUrgencia(Urgencias p) throws HibernateException {
        try {
            iniciaOperacion();
            sesion.delete(p);
            tx.commit();
        } catch (HibernateException he) {
            manejaExcepcion(he);
            throw he;
        } finally {
            sesion.close();
        }
    }
    
    public void actualizaUrgencia(Urgencias p) throws HibernateException {
        try {
            iniciaOperacion();
            sesion.update(p);
            tx.commit();
        } catch (HibernateException he) {
            manejaExcepcion(he);
            throw he;
        } finally {
            sesion.close();
        }
    }
    
    public void updateUrgencia(Urgencias urgencia) {
        iniciaOperacion();
        sesion.update(urgencia);
        tx.commit();
        sesion.close();
    }
    
    public List<Urgencias> obtenListaUrgencias(String fecha, String idUrgencia) throws HibernateException {
        List<Urgencias> listaUrgencias = null;
        try {
            iniciaOperacion();
            listaUrgencias = sesion.createQuery("from Urgencias where idUrgencia like '"+idUrgencia+"' and fecha like '"+fecha+"'").list();
        } catch (HibernateException he) {
            manejaExcepcion(he);
            throw he;
        } finally {
            sesion.close();
        }
        return listaUrgencias;
    }
    
    
    
    /**
     * Devuelve una Urgencia segun un Proceso Asistencial pasado como parámetro
     * @param pa Proceso Asistencial del que querems saber su Ingreso asociado
     * @return La Urgencia asociada si existe. NULL, si no existe.
     * @author cvenegas
     */
    private static Session staticSesion;
    public static Urgencias getUrgencia(Procesoasistencial pa){
        Urgencias urgencia;
        staticSesion = HibernateUtil.getSessionFactory().openSession();//ABRIMOS UNA SESION
        staticSesion.beginTransaction();//ARRANCA LA TRANSACCION
        urgencia = (Urgencias) staticSesion.createQuery("FROM Urgencias WHERE procesoasistencialidPa = '" + pa.getIdPa() + "'").uniqueResult();
        return urgencia;
    }
    
    
    public List<Urgencias> getUrgencias(){
        List<Urgencias> urgencias;
        staticSesion = HibernateUtil.getSessionFactory().openSession();//ABRIMOS UNA SESION
        staticSesion.beginTransaction();//ARRANCA LA TRANSACCION
        urgencias = staticSesion.createQuery("from Urgencias").list();
        return urgencias;
    }

}
